package domain;

import java.util.Properties;
import java.util.Random;

import aima.core.search.framework.Problem;
import aima.core.search.framework.Search;

import entry.Application;

public class randomRoosterGeneratie 
{

	// groote van de doubele array
	private int n;

	// doubele array
	private char[][] rooster;

	public randomRoosterGeneratie(int n) 
	{

		this.rooster = new char[n + 2][n + 2]; // we maken het veld iets breder
												// voor de buitenmuren
		this.n = n;
	}

	public char[][] getRooster()
	{
		return rooster;
	}

	public void generateRooster() 
	{
		boolean geldigSpeeldveld = false;
		
		while(!geldigSpeeldveld)
		{
			
		// opbouwen van buitenste muren en positioneren van pacman & kruimel
			for (int row = 0; row < (n + 2); row++) // buitenste muren worden meegeteld
			{
				for (int column = 0; column < (n + 2); column++) 
				{
					if (row == 0 || column == 0 || row == n + 1 || column == n + 1)
						rooster[row][column] = '%';
	//				else if (j == n / 2 && i == n) // punt midden laatste rij
	//					rooster[i][j] = '.';
					else if (row == 1 && column == 1)// positie pacman
						rooster[row][column] = 'P';
					else
						rooster[row][column] = ' '; // leeg vak
				}
			}
		
	
		
			if(n != 1)
			{
				rooster[n][1 + n/2] = '.';
			}
		

	
		
			generate();
			
			
			
			
			
			//controleer of het gegenereerde rooster wel op te lossen valt
			PacmanBoard board = new PacmanBoard(rooster); // = state
			Problem problem = new Problem(board, new PacmanActionsFunction(), new PacmanResultFunction(), new PacmanGoalTest());		
			Search search  = Application.createSearch(SearchType.BFSGraph);
			Properties instrumentation = Application.performSearch(problem, search);
			
			if(n == 1) //n == 1 -> pathcost == 0
			   geldigSpeeldveld = true;
			else if(Float.valueOf((String)instrumentation.get("pathCost")) != 0)
				geldigSpeeldveld = true;
			else
			{
				System.out.println("Design rejected, regenerating");
			}
		}

	}

	

	
	
	public void generate()
	{

			int nodigeMuren = (n * n) / 4; // we bebouwen 25% van het speelveld met
										   // muren
			
			Random randomGenerator = new Random();

				System.out.println("generating " + nodigeMuren + " walls");
		
				for (int i = 0; i < nodigeMuren; ++i) 
				{
					boolean vakGevonden = false;
					while (!vakGevonden)
					{
						// genereer willekeurige positie
						int xPos = 1 + randomGenerator.nextInt(n + 1);
						int yPos = 1 + randomGenerator.nextInt(n + 1);
		
						// controleer of de positie geldig is (= leeg vakje)
						if (rooster[xPos][yPos] == ' ') 
						{
							rooster[xPos][yPos] = '%'; // plaats muur
							vakGevonden = true;
						}
		
					}
				}
				
		

	}

}
